本文将介绍自定义V2步骤FLOW-CLI工具的YAML描述语言。
步骤YAML描述语法
flow-cli step init 初始化模板step.yaml:
---
id: FlowCustomStep
name: 流水线自定义步骤
description: flow custom step demo
helpUrl: https://atomgit.com/flow-step-custom/Test
execution:
executor: node
main: dist/index.js
items:
- label: input 参数
name: abc
type: input
description: input 类型参数 abc
value: hello world
- label: password 参数
name: your_password
type: password
description: password 类型参数 your_password
- label: textarea 参数
name: exclusion
type: textarea
value: |
test/
build/
description: textarea 类型参数 exclusion
- label: select 参数
name: select_version
type: select
value: v1.0.0
datasource:
- label: "v1.0.0"
value: v1.0.0
- label: "v1.0.1"
value: v1.0.1
- label: "v1.0.2"
value: v1.0.2
description: select 类型参数 select_version
- label: 参数 edf
name: edf
type: input
showCondition: ${select_version} == "v1.0.0"
description: 配置 showCondition,只有当 select_version == v1.0.0 才展示
- label: 开关
name: toggle
type: checkbox
value: false
字段 | 是否必填 | 说明 |
id | 是 | 作为步骤 sign 取值,全局唯一,例如 HelloV2Step |
name | 是 | 步骤名称 |
description | 是 | 步骤描述 |
helpUrl | 是 | 帮助文档链接,一般为步骤对应仓库地址 |
execution | 是 | 当前固定值为: execution: executor: node main: dist/index.js |
items | 否 | 步骤参数定义,详见 Item 属性列表 |
Item 属性
属性名称 | 含义 | 是否必填 | 默认值 | 哪些 Type的item 可以使用 |
type | item的不同类型决定了其展现形式。
不同类型 item 示例: | 是 | 无 | 全部 |
label | 该 item 在表单中显示的标题 | 是 | 无 | 全部 |
name | 作为该 item的唯一标识,使用驼峰形式。
| 是 | 无 | 全部 |
value | 默认值 | 否 | 无 | input |
description | 在item的右边显示一个问号,显示提示信息。 | 否 | 无 | 所有 |
datasource | 数据源。 静态数据源的 value 是数组:
| 否 | 无 | select |
showCondition | 该 item 的显示条件,比如:
该示例标识,只有参数 abc 为选项 1 时,才展示参数 edf 的配置选项 | 否 | 无 | 所有 |
高级用法示例
使用 Java构建或者docker构建等前置任务的输出
在step.yaml
中items下添加如下内容:
- label: 外部输入
name: INPUT
type: upstream_component_output
autoComplete: true
input_type: artifacts
description: 前序输入
type:upstream_component_output 表示使用前面任务的产出物,支持构建出的产物以及构建出的镜像。 目前支持构建的产物,例如Java构建的包数据如下:
{"ARTIFACT_URL":"https://rdc-build.aliyuncs.com/aone2/build-service/api/v2/ossproxy/download?ns=execution-component&bucketName=execution-component-rdc&fileId=aone2/2000860/1607602660253/default.tgz&fileName=default.tgz&md5Sign=02d27f4c5b81fa50c8ea1ad4676e4512","ARTIFACT_NAME":"default.tgz", "ARTIFACT_MD5":"369fbdeb124db1182f3ed56c5717aa31", "WEB_DOWNLOAD_URL":"execution-component&bucketName=execution-component-rdc&fileId=aone2%2F2000860%2F1607602660253%2Fdefault.tgz&artifactName=default.tgz"}
镜像构建的产物数据如下:
{"DOCKER_URL":"registry.cn-hongkong.aliyuncs.com/xiaoxuan/java-ceshi-spring-boot-demo:2020-12-10-20-38-01","ARTIFACT_URL":"https://rdc-build.aliyuncs.com/aone2/build-service/api/v2/ossproxy/download?ns=execution-component&bucketName=execution-component-rdc&fileId=aone2/2002689/1607603999672/application_docker_url_config.desc&fileName=application_docker_url_config.desc&md5Sign=4abee7adfc770e4dd943cb7302180d0e","ARTIFACT_MD5":"bf531410bfcf36c42b1735bb8c927edd"}
在步骤的src/index.ts可以通过以下代码获取到以上数据进行处理( JSON 格式化后获取字段)。
const input = process.env["INPUT"] as string
step.info(`INPUT=${input}`)
自定义步骤的产物输出,方便后续步骤使用
在step.yaml中加上以下内容:
- label: 制品名称
name: ARTIFACT
value: default
export_to_output:
type: artifact
description: 自定义产出物名称,定义后在部署组件使用
alias: 制品
dynamicName: default
type: input
description: 制品名称为当前构建产物的名称。用于区分多次构建产生的不同产出物,定义后在部署组件使用。例如"default"
在 src/index.ts 中加上以下修改:
其中ARTIFACT要和step.yaml
中定义的name一样。
导出 docker 镜像地址。
const artifact = new step.artifact.CustomArtifactDocker({ dockerURL: 'registry/namespace/repo:tag', }); step.artifact.exportCustomArtifactDocker(`ARTIFACT`, artifact);
导出制品地址。
const artifact = new step.artifact.CustomArtifact({ artifactURL: "fake_artifact_url" }); step.artifact.exportCustomArtifact(`ARTIFACT`, artifact);
ARTIFACT 的变量就可以在后面的步骤中获取到。
配置服务链接,获取外部服务配置、账密等变量
参考以下不同类型代码实现
在
step.yaml
添加配置片段示例。items: - label: en_US: Choose Service Connection zh_CN: 选择授权 type: select name: SERVICE_CONNECTION_ID nameAlias: serviceConnection scType: oss rules: - require datasource: type: remote api: /base/service/credential/service/connection/list?scType=oss use_proxy: false searchable: true label: connectionName value: id createable: title: en_US: New Service Connection zh_CN: 新建服务授权 desc: zh_CN: 新建服务授权 en_US: New Service Connection type: dialog url: /ram permission: tb.role.serviceConnection.create scType: oss scTypeName: zh_CN: 阿里云对象存储服务 en_US: Aliyun OSS component: addServiceConnection viewable: paramName: id url: /base/service/credential/service/connection - label: zh_CN: Bucket地域 en_US: Bucket Region name: OSS_REGION nameAlias: region type: select rules: - require datasource: - label: en_US: Qingdao zh_CN: 华北1(青岛) value: cn-qingdao - label: en_US: Beijing zh_CN: 华北2(北京) value: cn-beijing - label: en_US: Zhangjiakou zh_CN: 华北3(张家口) value: cn-zhangjiakou - label: en_US: Huhehaote zh_CN: 华北5(呼和浩特) value: cn-huhehaote - label: en_US: Nanjing zh_CN: 华东5(南京) value: cn-nanjing - label: en_US: Wulanchabu zh_CN: 华北6(乌兰察布) value: cn-wulanchabu - label: en_US: Hangzhou zh_CN: 华东1(杭州) value: cn-hangzhou - label: en_US: Shanghai zh_CN: 华东2(上海) value: cn-shanghai - label: en_US: Shenzhen zh_CN: 华南1(深圳) value: cn-shenzhen - label: en_US: Heyuan zh_CN: 华南2(河源) value: cn-heyuan - label: en_US: Guangzhou zh_CN: 华南3(广州) value: cn-guangzhou - label: en_US: Chengdu zh_CN: 西南1(成都) value: cn-chengdu - label: en_US: Hong Kong zh_CN: 中国(香港) value: cn-hongkong - label: en_US: Tokyo zh_CN: 日本(东京) value: ap-northeast-1 - label: en_US: Singapore zh_CN: 新加坡 value: ap-southeast-1 - label: en_US: Kuala Lumpur zh_CN: 马来西亚(吉隆坡) value: ap-southeast-3 - label: en_US: Jakarta zh_CN: 印度尼西亚(雅加达) value: ap-southeast-5 - label: en_US: Virginia zh_CN: 美国(弗吉尼亚) value: us-east-1 - label: en_US: Silicon Valley zh_CN: 美国(硅谷) value: us-west-1 - label: en_US: London zh_CN: 英国(伦敦) value: eu-west-1 - label: en_US: Dubai zh_CN: 阿联酋(迪拜) value: me-east-1 - label: en_US: Frankfurt zh_CN: 德国(法兰克福) value: eu-central-1 - label: en_US: cn-north-2-gov-1 zh_CN: 华北2-阿里政务云1 value: cn-north-2-gov-1 - label: en_US: Bucket Name zh_CN: Bucket名称 name: OSS_BUCKET nameAlias: bucket extra: type: link-button url: https://oss.console.aliyun.com/bucket identifier: oss type: select rules: - require datasource: type: remote api: /base/service/credential/oss/bucket/list?ossRegion=${OSS_REGION}&serviceConnectionId=${SERVICE_CONNECTION_ID} use_proxy: false searchable: true
在
src/index.ts
里通过以下代码获取配置真实值。const flowJobToken: string | undefined = process.env['FLOW_JOB_TOKEN'] if (flowJobToken == undefined) { throw new Error('missing FLOW_JOB_TOKEN') } const ossRamCertificate = await step.certificate.getOssRamServiceConnectionCertificate(flowJobToken,process.env.SERVICE_CONNECTION_ID as string) if (ossRamCertificate == undefined || ossRamCertificate.accessKeyId == undefined) { throw new Error(`got OssRamServiceConnectionCertificate but error: ${JSON.stringify(ossRamCertificate)}`) } const endpoint = `oss-${process.env.OSS_REGION as string}.aliyuncs.com` const accessKeyID = ossRamCertificate.accessKeyId; const accessKeySecret = ossRamCertificate.accessKeySecret; const securityToken = ossRamCertificate.securityToken; const bucket = process.env.OSS_BUCKET as string; step.info("-------------------oss----------------------") step.info(endpoint) step.info(accessKeyID) step.info(accessKeySecret) step.info(securityToken) step.info("-------------------oss----------------------")